因为好久没写 OC 代码了,回头重看 《Effective Objective-C 编写高质量 iOS 与 OS X 代码的 52 个有效方法》,总结一些 OC 编码时的技巧。

1. 除非必要,否则不要引入头文件

一般来说,应再某个类的头文件中使用向前声明来提及某个类,并在实现文件(.m)中引入那些类的头文件,以降低类之间的耦合。
当无法使用向前声明时,比如要声明某个类遵循某个协议。在这种情况下,尽量把该类遵循某协议的声明移入class-continuation 分类中。如果不行的话,就把某协议单独放在一个头文件中,然后将其引入。

2. 尽量使用字面量创建数组、字典、字符串、数值

与常规方法相比更加简明。同时,如果值中有 nil,则会抛出异常,方便定位问题。而使用常规方法遇到 nil 会自动结束向集合添加数值。

3. 避免使用 #define 预处理命令定义常量

因为这样定义出来的常量不含类型信息,仅做预编译阶段的替换操作。无法利用编译器产生警告信息。
应该选择在实现文件中使用 static(定义作用域) const(readOnly) 来定义只在编译单元内可见的常量,此常量不在全局符号表中,无需加前缀。
如果需要定义全局常量,选择在头文件中使用 extern.并在相关实现文件中初始化其值,因为这种常量会出现再全局符号表中,所以应该加前缀,通常使用与之相关的类名做前缀。(OC 没有命名空间)。

4. 使用枚举表示状态、选项、状态码

应该使用枚举来表示状态机的状态、传递给方法的选择以及状态码等值,给这些值起个易懂的名字。
如果把传递给某个方法的选项用枚举表示,而多个选择又可以同时使用,那么就将各选项值定义为 2 的幂,以便通过按位或操作将其组合起来。
NS_ENUMNS_OPTIONS 宏来定义枚举类型,并指明底层数据类型。

1
2
3
4
5
6
7
8
9
10
11
12
typedef NS_ENUM(NSUInteger, EOCConnectionState) {
EOCConnectionStateDisconnected,
EOCConnectionStateConnecting,
EOCConnectionStateConnected,
}
typedef NS_OPTIONS(NSUInteger, EOCPermittedDirection) {
EOCPermittedDirectionUp = 1 << 0,
EOCPermittedDirectionDown = 1 << 1,
EOCPermittedDirectionLeft = 1 << 2,
EOCPermittedDirectionRight = 1 << 3,
}